// 有默认实参的模板类型形参
#include <iostream>
#include <string>
#include <type_traits>

using namespace std::string_literals;

//三目表达式要去第二项和第三项之间能够进行隐式转换
// template <typename T1, typename T2, typename RT = decltype(true ? T1{} : T2{})>
// RT max(const T1& a, const T2& b) {
//     return a > b ? a : b;
// }

// //c++11 后置返回类型
// template <typename T1, typename T2>
// auto max(const T1& a, const T2& b) -> decltype(true ? a : b)
// {
//     return a > b ? a : b;
// }

// //c++14 引入了返回类型推导 auto 形参需要c++20支持
// auto max(const auto& a, const auto& b) 返回值类型没有cv限定
// {
//     return a > b ? a : b;
// }

//
decltype(auto) max(const auto& a, const auto& b) // 返回值类型有cv限定
{
    return a > b ? a : b;
}

int main() 
{  
    ::max("1", "2.0"s); // OK: RT 被推导为 std::string
    ::max(1, 2);   // OK: RT 被推导为 int

    using T = decltype(true ? 1 : 2.0); // RT 被推导为 double
    using T1 = decltype(false ? 1 : 2.0); // RT 被推导为 double
    std::cout << std::is_same_v<T, double> << std::endl;
    std::cout << std::is_same_v<T1, double> << std::endl; 

    return 0;
}